// 该函数是使用fcntl函数获得argv参数制定文件的描述符
// 并且打印该文件的标志说明实例。
// 应用代码使用fcntl获取了文件的描述符，然后使用switch语句对文件的类型进行判断
// 并且输出相应的判断结果
//
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
	
	int ret;

	if(argc != 2){
		printf("Please input the current para!\n");
		return -1;
	}

	// 使用F_GETFL来获得文件的所有标志位
	ret = fcntl(atoi(argv[1]), F_GETFL, 0);

	if(ret == -1){
		printf("文件%s的标志位获取失败!\n", atoi(argv[1]));
		return -2;
	}
	printf("atoi(argv[i]) = %d\n", atoi(argv[1]));
	// 判断文件的类型
	printf("文件%s的类型为：", argv[1]);
	switch(ret & O_ACCMODE){
		case O_RDONLY:
			printf("只读！\n");
			break;
		case O_WRONLY:
			printf("只写! \n");
			break;
		case O_RDWR:
			printf("读写!\n");	
			break;
		default:
			printf("未知的模式！\n");
			break;
	}

	if(ret & O_APPEND){
		printf(" 写时追加\n");
	}

	if(ret & O_NONBLOCK){
		printf(" 非阻塞\n");
	}

// 等待数据和属性写完成
#if defined(O_SYNC)
	if(ret & O_SYNC){
		printf(" 写同步\n");
	}
#endif

#if defined(_POXIS_C_SOURCE) && defined(O_FSYNC)
	if(ret & O_FSYNC)	// 等待写完成
	{
		printf(" 等待写完成\n");
	}
#endif

	putchar('\n');
	return 0;
}

